package LeetCode刷题;

/**
 * @program: Java_Study
 * @author: Xiaofan
 * @createTime: 2021-10-08 20:29
 * @description: Functions of this class is
 * 官方题解（有效自动机解题）：
 * public class Solution {
 *
 *     public int myAtoi(String str) {
 *         int len = str.length();
 *         // str.charAt(i) 方法回去检查下标的合法性，一般先转换成字符数组
 *         char[] charArray = str.toCharArray();
 *
 *         // 1、去除前导空格
 *         int index = 0;
 *         while (index < len && charArray[index] == ' ') {
 *             index++;
 *         }
 *
 *         // 2、如果已经遍历完成（针对极端用例 "      "）
 *         if (index == len) {
 *             return 0;
 *         }
 *
 *         // 3、如果出现符号字符，仅第 1 个有效，并记录正负
 *         int sign = 1;
 *         char firstChar = charArray[index];
 *         if (firstChar == '+') {
 *             index++;
 *         } else if (firstChar == '-') {
 *             index++;
 *             sign = -1;
 *         }
 *
 *         // 4、将后续出现的数字字符进行转换
 *         // 不能使用 long 类型，这是题目说的
 *         int res = 0;
 *         while (index < len) {
 *             char currChar = charArray[index];
 *
 *             // ！！！！！！！！！！！！！！！！！！！！！4.1 先判断不合法的情况！！！！！！！！！！！！！！！！！！！
 *             if (currChar > '9' || currChar < '0') {
 *                 break;
 *             }
 *
 *             // 题目中说：环境只能存储 32 位大小的有符号整数，因此，需要提前判：断乘以 10 以后是否越界
 *             if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (currChar - '0') > Integer.MAX_VALUE % 10)) {
 *                 return Integer.MAX_VALUE;
 *             }
 *             if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (currChar - '0') > -(Integer.MIN_VALUE % 10))) {
 *                 return Integer.MIN_VALUE;
 *             }
 *
 *             // 4.2 合法的情况下，才考虑转换，每一步都把符号位乘进去
 *             res = res * 10 + sign * (currChar - '0');
 *             index++;
 *         }
 *         return res;
 *     }
 * }
 *
 **/
public class NoNo表示数值的字符串 {
    public static void main(String[] args) {
        System.out.println(myAtoi("-45645 fsdff"));
    }

    public static int myAtoi(String s) {
        if (s.length() == 0) {
            return 0;
        }

        int judgeNum = Integer.MAX_VALUE;
        int i = 0;
        long ans = 0;
        int temp=1;
        while (i<s.length()&&s.charAt(i)==' '){
            i++;
        }
        if (s.charAt(i) == '-') {
            ans=-1*(s.charAt(i+1)-'0');
            judgeNum = Integer.MIN_VALUE;
            i+=2;
            temp=-1;
        }
        for (; i < s.length()&&(s.charAt(i)<='9'&&s.charAt(i)>='0'); i++) {
//            char c=s.charAt(i);
//            if(c==' '){
//                continue;
//            }
            if (judgeNum > 0 && (ans * 10 > judgeNum)) {
                return judgeNum;
            } else if (judgeNum < 0 && (ans * 10 < judgeNum)) {
                return judgeNum;
            }
            ans = ans * 10 + (s.charAt(i) - '0')*temp;
        }
        return (int)ans;
    }
}